/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.torresquintero.oncologos.common.factory;

import com.torresquintero.oncologos.entidades.DetalleRol;
import com.torresquintero.oncologos.entidades.Funcionario;
import java.util.List;
import javax.persistence.EntityManager;

/**
 * Clase para controlar el funcionario que esta en session.
 * 
 * @author Camilo Andres
 */
@SuppressWarnings("unchecked")
public class LogginManager {

    /**
     * TODO: definir el valor en el archivo de props. Mensaje desde el archivo
     * de propiedadea que indica el password erroneo.
     */
    private static final String MSJ_LOGGIN_MANAGER_PASSWORD_INVALIDO = "LogginManager.PasswordInvalido";
    /**
     * TODO: definir el valor en el archivo de props. Mensaje desde el archivo
     * de propiedadea que indica el nombre de usuario erroneo.
     */
    private static final String MSJ_LOGGIN_MANAGER_USUARIO_NO_EXISTE = "LogginManager.UserInvalido";
    /**
     * Funcionario en Session.
     */
    private static Funcionario funcionarioLogedIn;

    /**
     * Metodo para ingresar a la aplicacion
     * 
     * @param login
     *            nombre de usuario del funcionario
     * @param password
     *            contraseña del funcionario.
     * @return true si fue existoso.
     */
    public static boolean LogIn(String login, String password) throws Exception {

        EntityManager em = FactoryEntityManager.getEm();

        /* Buscando el funcionario por Login */

        List<Funcionario> funcionarios = em.createNamedQuery(Funcionario.FIND_FUNCIONARIO_BY_LOGIN).setParameter(Funcionario.PARAMETRO_LOGIN, login).getResultList();

        if (funcionarios.size() != 0) {

            Funcionario f = funcionarios.get(0);
            /* Verificando Password */
            if (f.getPassword().equals(password)) {

                funcionarioLogedIn = f;

                /* Cargar los roles. */
                List<DetalleRol> roles = em.createNamedQuery(
                        DetalleRol.FIND_DETALLE_ROL_BY_LOGIN_FUNCIONARIO).setParameter(DetalleRol.PARAMETRO_LOGIN_FUNCIONARIO,
                        login).getResultList();

                funcionarioLogedIn.setRoles(roles);

                return true;

            } else {
                throw new Exception(
                        Mensajes.getMensaje(MSJ_LOGGIN_MANAGER_PASSWORD_INVALIDO));
            }
        } else {
            throw new Exception(
                    Mensajes.getMensaje(MSJ_LOGGIN_MANAGER_USUARIO_NO_EXISTE));

        }

    }

    /**
     * Metodo que permite indicar si un rol esta en sesion
     * 
     * @param rol
     *            rol a verificar
     * @return true si esta el rol activado.
     */
    public boolean poseeRol(String rol) {

        /* Recorriendo los roles del funionarioo en session */
        for (DetalleRol detalleRol : funcionarioLogedIn.getRoles()) {
            /* Posee el rol. */
            if (detalleRol.getRol().getDescripcion().equals(rol)) {
                return true;
            }

        }
        return false;

    }

    /**
     * Metodo que indica cuales son los roles activos en la session.
     * @return un arreglo de Strings con los Roles.
     */
    public static String[] getRolesActivos() {

        if (funcionarioLogedIn != null) {
            String[] roles = new String[funcionarioLogedIn.getRoles().size()];

            int i = 0;
            for (DetalleRol rol : funcionarioLogedIn.getRoles()) {
                roles[i++] = rol.getRol().getDescripcion();
            }

            return roles;
        }
        return new String[]{"administrador"};
    }
    /**
     * Funcionario que inicio session
     * @return 
     */
    public static Funcionario getFuncionarioLogedIn() {
        return funcionarioLogedIn;
    }
    
    
}
